SceneNumber
extending
sequence
而來,作為場景的計數器。需要留意的是每一個sequence
可以被多個property
呼叫,共享同一個計數器。如果單一property
需要獨立的計數器,需要各別extending
sequence
生成特定的sequence
。
scalar type SceneNumber extending sequence;
Event
有一個detail property
及三個multi link
用來協助記錄相關的人時地。
abstract type Event {
detail: str;
multi who: Character;
multi `when`: FuzzyTime;
multi where: Place;
}
由於when
是EdgeDB語法的關鍵字,所以必須使用加上backtick的`when`。這邊需要留意,一旦使用backtick,那麼以後所有的EdgeQL操作中,引用到此property
時或link
時都要繼續使用backtick,也就是以後所有的query中,都必須使用`when`,而非when
。使用者需要視習慣,決定使用此語法或另外命名一個例如when_
的名字。
Scene
extending
Event
而來,用來記錄各場景資訊。
type Scene extending Event {
title: str;
remarks: str;
references: array<tuple<str, str>>;
required scene_number: SceneNumber {
constraint exclusive;
default := sequence_next(introspect SceneNumber);
}
index on (.scene_number);
}
其有四個property
:
title property
為標題。remarks property
為註解。references property
為參考資料連結。scene_number property
為自動產生編號的計數器。
sequence_next()
作為scene_number
的default
,可以在每次insert
新Scene
時,自動產生編號(註2)。其中introspect是不可省略的關鍵字,原因是sequence_next()
接收的參數必須是ScalarType
,詳細的說明請參考Easy EdgeDB 第十三章。introspection
是一個非常強大可以輔助探索EdgeDB內部的工具,但對於初學者而言,可能只會在使用sequence
時才會遇到,所以這邊我們省略不提。此外,由於我們可能會常順向或逆向存取Scene
,所以替scene_number
加上了index
(註3)。
註1:這邊比較有趣的一點是,exclusive有提到Scalar type definitions cannot include this constraint.
,但是sequence
的範例卻是可以加上exclusive constraint
。
註2:根據sequence的範例,或許此default := sequence_next(introspect SceneNumber);
可以省略。
註3:一般而言,EdgeDB會隱性地將擁有exclusive constraint
的property
加上index
,所以理論上,我們可能不需要自己再加一次。但是因為註1的原因,為保險起見,我們於此處顯性地加上index on (.scene_number);
。